package com.数组中数字出现的个数_重要;

public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        //1首先找到两个单独出现的数的亦或的值，因为别的数字出现两次亦或会被抵消掉
    	int temp=array[0];
    	for(int i=1;i<array.length;i++) {
    		temp=temp^array[i];
    	}
    	//temp的值就是存放两个不同的数的亦或的结果
    	//接着就要找temp中第一个为1的那个二进制的下标，从右边开始找起来
    	int index=findFirst1(temp);
    	//接着就是从数组中去遍历，将index位是1的分到一个组去，是0的也分到一个组去
    	for(int i=0;i<array.length;i++) {
    		if(chargeBit1(array[i], index)) {
    			num1[0]=num1[0]^array[i];
    		}else {
    			num2[0]=num2[0]^array[i];
    		}
    	}
    }
    public int findFirst1(int temp) {
    	int index=0;
    	while((temp&1)==0&&index<32) {
    		index++;
    		temp=temp>>1;
    	}
    	return index;
    }
    //用于判断这个数从右边开始的第index位是不是1
    public boolean chargeBit1(int num,int index) {
    	num=num>>index;
    	if((num&1)==1) {
    		return true;
    	}
    	else {
    		return false;
    	}
    }
}
